Review of ClibGen
by
Shawn M. Gordon
President
S.M.Gordon & Associates
Introduction
This time around we have a COBOL programmers utility, and as far as I am concerned, you can never have to many tools for making programming easier, especially for COBOL. ClibGen is a utility that build and maintains COBOL copy libraries and include files. ClibGen will also establish Procedure Division programming for various IMAGE database calls, to help enforce coding standards.
I ran ClibGen on my HP 3000 series 925 running MPE/iX 4.0.
Features
ClibGen is a command line interface program, some of the commands have immediate actions, and other commands set options for generating output. So what is it that ClibGen actually do? Well at it’s most basic, you can point it to a dataset, or an entire database, and have it generate all the working storage records layouts for you in either a COPYLIB or as an INCLUDE file. Optionally it can also generate the PROCEDURE DIVISION code that will add, update, retrieve, and delete your database, for the datasets that you generated. There is even an option to generate code to take advantage of SpeedDemon routines from Robelle.
The manual states that ClibGen can work with Image databases, COBOL copy libraries, COBOL INCLUDE files, SpeedWare catalogs, COGNOS data dictionaries, and Self Describing files. However my release only worked with IMAGE, and generated COBOL output. The version that supports all the other file formats should be available by the time you read this review.
So how would a typical session with ClibGen work, see Figure 1 for a sample of how you would start up. The ClibGen command is CG>
------------------------------------------------------ Figure 1 :clibgen.pub.vvl ClibGen A.00.00 Copyright (c) 1994-1995 VVL Associates, Inc. Liscensed to: Shawn Gordon <[>Demo 12/1/95] I TRACE.PUB Input file is set to TRACE.PUB() FO Database: TRACE.PUB No. Dataset Type Words B/F Entries Capacity % Full 1. INNER-JOB-A A 13 85 5 809 0.61 2. RUN-STAT-A A 3 145 113 251 45.01 3. OUTER-JOB-M M 106 16 264 853 30.94 4. ALIAS-M M 38 18 1 18 5.55 5. INNER-JOB-D D 29 55 5 770 0.64 6. RUN-STAT-D D 34 48 3395 6048 56.13 7. ALIAS-D D 9 16 2 16 12.50 > FO (@ Database: TRACE.PUB INNER-JOB-A ;Automatic Entry: Offset Bytes INNER-JOB, U26 1 26 <> Capacity: 809 Entries: 5 Total Bytes: 26 RUN-STAT-A ;Automatic Entry: Offset Bytes RUN-DATE, X6 1 6 < > Capacity: 251 Entries: 113 Total Bytes: 6 OUTER-JOB-M ;Manual Entry: Offset Bytes OUTER-JOB, U26 1 26 < > FLAGS, X6 27 6 JOB-DESC, 3X60 33 180 Capacity: 853 Entries: 264 Total Bytes: 212 ALIAS-M ;Manual Entry: Offset Bytes ALIAS-FLAG, X2 1 2 < > ALIAS-DESC, X74 3 74 Capacity: 18 Entries: 1 Total Bytes: 76 INNER-JOB-D ;Detail Entry: Offset Bytes OUTER-JOB, U26 1 26 < > INNER-JOB, U26 27 26 < > FLAGS, X6 53 6 Capacity: 770 Entries: 5 Total Bytes: 58 RUN-STAT-D ;Detail Entry: Offset Bytes OUTER-JOB, U26 1 26 < > STREAMER, X26 27 26 RUN-DATE, X6 53 6 < > RUN-TIME, X8 59 8 WALL-TIME, J1 67 2 Capacity: 6048 Entries: 3395 Total Bytes: 68 ALIAS-D ;Detail Entry: Offset Bytes ALIAS-NAME, X16 1 16 ALIAS-FLAG, X2 17 2 <<< <;> Capacity: 16 Entries: 2 Total Bytes: 18 ----------------------------------------------------
So what we have done here is open the database for input with the I (or INPUT) command, check to see what sets where in it with the QUERY like command FO, then get a detail QUERY like listing by using the FO command with the @ parameter. We could specify a data set name here to get a specific set, but the @ indicates ALL data sets.
It’s important to note that ClibGen is pretty forgiving when it comes to accepting commands from you. As you saw, all the commands can be abbreviated, and if there is an option that is required at processing time that you didn’t supply by setting it on, then ClibGen will prompt for it.
Now we are going to go ahead and take all the default options, which means generate pretty much everthing. See figure two for that dialog;
----------------------------------------------------------------------------------- Figure 2 CG>LIB TRLIB.SOURCE Creating COBOL Copylib TRLIB.SOURCE Enter Keyfile Name - TRLIBK Output File is set to "TRLIB.SOURCE,CLIB". X Generating TRACE Database Declarations. Enter Password (Programmatic Access) - FUGAZI Generating TRACE database routines. Enter a COBOL Prefix for OUTER-JOB-M, (up to 5 Chars) - OJM Generating OUTER-JOB-M dataset Data decalarations. Generating OUTER-JOB-M dataset Read routines. Generating OUTER-JOB-M dataset Write routines. Enter a COBOL Prefix for ALIAS-M, (up to 5 Chars) - AM Generating ALIAS-M dataset Data decalarations. Generating ALIAS-M dataset Read routines. Generating ALIAS-M dataset Write routines. Enter a COBOL Prefix for INNER-JOB-D, (up to 5 Chars) - IJD Generating INNER-JOB-D dataset Data decalarations. Generating INNER-JOB-D dataset Read routines. Generating INNER-JOB-D dataset Write routines. Enter a COBOL Prefix for RUN-STAT-D, (up to 5 Chars) - RSD Generating RUN-STAT-D dataset Data decalarations. Generating RUN-STAT-D dataset Read routines. Generating RUN-STAT-D dataset Write routines. Enter a COBOL Prefix for ALIAS-D, (up to 5 Chars) - AD Generating ALIAS-D dataset Data decalarations. Generating ALIAS-D dataset Read routines. Generating ALIAS-D dataset Write routines. 001220 Lines Created. --------------------------------------------------------------------------
Now what we did here was specify a copy library to generate with the LIB command, and then entered an X to eXecute the request. ClibGen responds by asking us for the database password, and prefix information for each data set that you are processing.
ClibGen has an enhanced interface to copy libraries over what COBEDIT has. You can use wild cards to find all the copy members that start with a particular string, and you can also look at INCLUDE files. Here again, if you don’t know a parameter, then ClibGen will prompt for it, or list everything. Look at figure 3 to see the modules that were generated by our previous session, as well as the code generated for a particular set.
--------------------------------------------------------------------------- Figure 3 CG>LIST Enter Copylib Member (KEY) - CopyLib TRLIB.SOURCE Text Modules: ADDD ADGT ADUP AMDD AMGT AMUP IJDDD IJDGT IJDUP OJMDD OJMGT OJMUP RSDDD RSDGT RSDUP TRACEDD TRACEOP CG>LIST TRACEDD 000001 TRACEDD 001000******************************************************************TRACEDD 001100* Database Declarations for TRACE [CG] TRACEDD 001200******************************************************************TRACEDD 001300 TRACEDD 001400 01 TRACE-BASE. TRACEDD 001500 05 FILLER PIC X(02) VALUE SPACES. TRACEDD 001600 05 TRACE-BASE-NAME PIC X(26) VALUE "TRACE;". TRACEDD 001700 TRACEDD 001800 01 TRACE-PASS PIC X(08) VALUE "FUGAZI;". TRACEDD 001900 TRACEDD 002000 01 TRACE-SECOND-PATH PIC X(28) VALUE SPACES. TRACEDD 002100 TRACEDD CG>LIST TRACEOP 000001 TRACEOP 001000******************************************************************TRACEOP 001100 OPEN-TRACE. TRACEOP 001200******************************************************************TRACEOP 001300 TRACEOP 001400 CALL "DBOPEN" USING TRACE-BASE, TRACE-PASS, TRACEOP 001500 DB-MODE-1, DB-STATUS. TRACEOP 001600 TRACEOP 001700 IF NOT DB-CALL-OK TRACEOP 001800 MOVE SPACES TO PUNT-MESSAGE TRACEOP 001900 STRING "Unable to OPEN ", TRACE-BASE-NAME TRACEOP 002000 DELIMITED BY SIZE INTO PUNT-MESSAGE TRACEOP 002100 PERFORM DB-PUNT TRACEOP 002200 END-IF. TRACEOP 002300 TRACEOP 002400******************************************************************TRACEOP 002500 CLOSE-TRACE. TRACEOP 002600******************************************************************TRACEOP 002700 TRACEOP 002800 CALL "DBCLOSE" USING TRACE-BASE, DB-SET-NAME, TRACEOP 002900 DB-MODE-1, DB-STATUS. TRACEOP 003000 TRACEOP 003100 IF NOT DB-CALL-OK TRACEOP 003200 MOVE SPACES TO PUNT-MESSAGE TRACEOP 003300 STRING "Unable to CLOSE ", TRACE-BASE-NAME TRACEOP 003400 DELIMITED BY SIZE INTO PUNT-MESSAGE TRACEOP 003500 PERFORM DB-PUNT TRACEOP 003600 END-IF. TRACEOP 003700 TRACEOP 003800******************************************************************TRACEOP 003900 UNLOCK-TRACE. TRACEOP 004000******************************************************************TRACEOP 004100 TRACEOP 004200 CALL "DBUNLOCK" USING TRACE-BASE, DB-SET-NAME, TRACEOP 004300 DB-MODE-1, DB-STATUS. TRACEOP 004400 TRACEOP 004500 IF NOT DB-CALL-OK TRACEOP 004600 MOVE SPACES TO PUNT-MESSAGE TRACEOP 004700 STRING "Unable to UNLOCK ", TRACE-BASE-NAME TRACEOP 004800 DELIMITED BY SIZE INTO PUNT-MESSAGE TRACEOP 004900 PERFORM DB-PUNT TRACEOP 005000 END-IF. TRACEOP 005100 TRACEOP CG>LIST RSD@ 000001 RSDDD 001000******************************************************************RSDDD 001100* Dataset Declarations for RUN-STAT-D of TRACE [CG] RSDDD 001200******************************************************************RSDDD 001300 RSDDD 001400 01 RSD-SET PIC X(16) VALUE "RUN-STAT-D;". RSDDD 001500 RSDDD 001600 01 RSD-ITEM-LIST. RSDDD 001700 05 FILLER PIC X(10) VALUE "OUTER-JOB,". RSDDD 001800 05 FILLER PIC X(09) VALUE "STREAMER,". RSDDD 001900 05 FILLER PIC X(09) VALUE "RUN-DATE,". RSDDD 002000 05 FILLER PIC X(09) VALUE "RUN-TIME,". RSDDD 002100 05 FILLER PIC X(10) VALUE "WALL-TIME;". RSDDD 002200 RSDDD 002300 01 RSD-ITEM-LIST-R REDEFINES RSD-ITEM-LIST. RSDDD 002400 05 RSD-SAME-LIST PIC X(02). RSDDD 002500 05 FILLER PIC X(45). RSDDD 002600 RSDDD 002700 01 RSD-GET-INDICATOR PIC X(02) VALUE "N". RSDDD 002800 88 RSD-RECORD-FOUND VALUE "Y". RSDDD 002900 88 RSD-NO-MORE-RECORDS VALUE "N". RSDDD 003000 RSDDD 003100 01 RSD-RECORD. RSDDD 003200 05 RSD-OUTER-JOB PIC A(26). RSDDD 003300 05 RSD-STREAMER PIC X(26). RSDDD 003400 05 RSD-RUN-DATE PIC X(06). RSDDD 003500 05 RSD-RUN-TIME PIC X(08). RSDDD 003600 05 RSD-WALL-TIME PIC S9(04) COMP. RSDDD 003700 RSDDD 003800 01 RSD-INIT-DATA PIC X(68). RSDDD 003900 RSDDD 000001 RSDGT 001000******************************************************************RSDGT 001100 GET-RSD-BY-OUTER-JOB. RSDGT 001200******************************************************************RSDGT 001300 RSDGT 001400 PERFORM FIND-RSD-BY-OUTER-JOB. RSDGT 001500 RSDGT 001600 IF RSD-RECORD-FOUND RSDGT 001700 PERFORM GET-NEXT-RSD RSDGT 001800 END-IF. RSDGT 001900 RSDGT 002000******************************************************************RSDGT 002100 FIND-RSD-BY-OUTER-JOB. RSDGT 002200******************************************************************RSDGT 002300 RSDGT 002400 MOVE "OUTER-JOB" TO DB-SEARCH-ITEM. RSDGT 002500 MOVE RSD-OUTER-JOB TO DB-VALUE. RSDGT 002600 PERFORM FIND-RSD. RSDGT 002700 RSDGT 002800******************************************************************RSDGT 002900 GET-RSD-BY-RUN-DATE. RSDGT 003000******************************************************************RSDGT 003100 RSDGT 003200 PERFORM FIND-RSD-BY-RUN-DATE. RSDGT 003300 RSDGT 003400 IF RSD-RECORD-FOUND RSDGT 003500 PERFORM GET-NEXT-RSD RSDGT 003600 END-IF. RSDGT 003700 RSDGT 003800******************************************************************RSDGT 003900 FIND-RSD-BY-RUN-DATE. RSDGT 004000******************************************************************RSDGT 004100 RSDGT 004200 MOVE "RUN-DATE" TO DB-SEARCH-ITEM. RSDGT 004300 MOVE RSD-RUN-DATE TO DB-VALUE. RSDGT 004400 PERFORM FIND-RSD. RSDGT 004500 RSDGT 004600******************************************************************RSDGT 004700 GET-RSD-SERIALLY. RSDGT 004800******************************************************************RSDGT 004900 RSDGT 005000 MOVE 2 TO DB-MODE. RSDGT 005100 PERFORM GET-RSD. RSDGT 005200 RSDGT 005300******************************************************************RSDGT 005400 GET-RSD-BACKWARDS. RSDGT 005500******************************************************************RSDGT 005600 RSDGT 005700 MOVE 3 TO DB-MODE. RSDGT 005800 PERFORM GET-RSD. RSDGT 005900 RSDGT 006000******************************************************************RSDGT 006100 REWIND-RSD. RSDGT 006200******************************************************************RSDGT 006300 RSDGT 006400 CALL "DBCLOSE" USING TRACE-BASE, RSD-SET, DB-MODE-3, RSDGT 006500 DB-STATUS. RSDGT 006600 RSDGT 006700 IF NOT DB-CALL-OK RSDGT 006800 MOVE SPACES TO PUNT-MESSAGE RSDGT 006900 STRING "REWIND FAILED FOR RSD" RSDGT 007000 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDGT 007100 PERFORM DB-PUNT RSDGT 007200 END-IF. RSDGT 007300 RSDGT 007400******************************************************************RSDGT 007500 FIND-RSD. RSDGT 007600******************************************************************RSDGT 007700 RSDGT 007800 CALL "DBFIND" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDGT 007900 DB-STATUS, DB-SEARCH-ITEM, DB-VALUE. RSDGT 008000 RSDGT 008100 IF NOT (DB-CALL-OK OR DB-RECORD-NOT-FOUND) RSDGT 008200 STRING "FIND FAILED FOR RSD ", DB-SEARCH-ITEM RSDGT 008300 " KEY=" DB-VALUE DELIMITED BY SIZE RSDGT 008400 INTO PUNT-MESSAGE RSDGT 008500 PERFORM DB-PUNT RSDGT 008600 END-IF. RSDGT 008700 IF DB-NO-CHAIN-FOUND OR DB-RECORD-NOT-FOUND RSDGT 008800 MOVE "N" TO RSD-GET-INDICATOR RSDGT 008900 ELSE RSDGT 009000 MOVE "Y" TO RSD-GET-INDICATOR RSDGT 009100 END-IF. RSDGT 009200 RSDGT 009300******************************************************************RSDGT 009400 GET-NEXT-RSD. RSDGT 009500******************************************************************RSDGT 009600 RSDGT 009700 MOVE 5 TO DB-MODE. RSDGT 009800 PERFORM GET-RSD. RSDGT 009900 RSDGT 010000******************************************************************RSDGT 010100 GET-PREV-RSD. RSDGT 010200******************************************************************RSDGT 010300 RSDGT 010400 MOVE 6 TO DB-MODE. RSDGT 010500 PERFORM GET-RSD. RSDGT 010600 RSDGT 010700******************************************************************RSDGT 010800 GET-RSD. RSDGT 010900******************************************************************RSDGT 011000 RSDGT 011100 CALL "DBGET" USING TRACE-BASE, RSD-SET, DB-MODE, RSDGT 011200 DB-STATUS, RSD-ITEM-LIST, RSD-RECORD, DB-PARM. RSDGT 011300 RSDGT 011400 IF NOT (DB-CALL-OK OR DB-END-OF-CHAIN OR DB-END-OF-FILE RSDGT 011500 OR DB-BEGINNING-OF-CHAIN OR DB-BEGINNING-OF-FILE) RSDGT 011600 MOVE SPACES TO PUNT-MESSAGE RSDGT 011700 STRING "GET FAILED FOR RSD " RSDGT 011800 " KEY=" DB-VALUE DELIMITED BY SIZE RSDGT 011900 INTO PUNT-MESSAGE RSDGT 012000 PERFORM DB-PUNT RSDGT 012100 END-IF. RSDGT 012200 RSDGT 012300 IF DB-CALL-OK RSDGT 012400 MOVE "Y" TO RSD-GET-INDICATOR RSDGT 012500 MOVE "*;" TO RSD-SAME-LIST RSDGT 012600 ELSE RSDGT 012700 MOVE "N" TO RSD-GET-INDICATOR RSDGT 012800 END-IF. RSDGT 012900 RSDGT 013000******************************************************************RSDGT 013100 SPDEDBINIT-RSD. RSDGT 013200******************************************************************RSDGT 013300 RSDGT 013400 MOVE 3 TO DB-MODE. RSDGT 013500 CALL "SPDEDBINIT" USING TRACE-BASE, RSD-SET, DB-MODE, RSDGT 013600 DB-STATUS, SPEED-DB-CONTROL, RSD-ITEM-LIST. RSDGT 013700 RSDGT 013800 IF NOT DB-CALL-OK RSDGT 013900 MOVE SPACES TO PUNT-MESSAGE RSDGT 014000 STRING "ERROR INIT FOR RSD-FAST " RSDGT 014100 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDGT 014200 CALL "SPDEEXPLAIN" USING DB-STATUS RSDGT 014300 PERFORM PROG-PUNT RSDGT 014400 END-IF. RSDGT 014500 RSDGT 014600 IF DB-CALL-OK RSDGT 014700 MOVE "Y" TO RSD-GET-INDICATOR RSDGT 014800 MOVE "*;" TO RSD-SAME-LIST RSDGT 014900 ELSE RSDGT 015000 MOVE "N" TO RSD-GET-INDICATOR RSDGT 015100 END-IF. RSDGT 015200 RSDGT 015300******************************************************************RSDGT 015400 SPDEDBSHUT-RSD. RSDGT 015500******************************************************************RSDGT 015600 RSDGT 015700 MOVE 1 TO DB-MODE. RSDGT 015800 CALL "SPDEDBSHUT" USING TRACE-BASE, RSD-SET, DB-MODE, RSDGT 015900 DB-STATUS, SPEED-DB-CONTROL, RSD-ITEM-LIST. RSDGT 016000 RSDGT 016100 IF NOT DB-CALL-OK RSDGT 016200 MOVE SPACES TO PUNT-MESSAGE RSDGT 016300 STRING "ERROR SHUT FOR RSD-FAST " RSDGT 016400 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDGT 016500 CALL "SPDEEXPLAIN" USING DB-STATUS RSDGT 016600 PERFORM PROG-PUNT RSDGT 016700 END-IF. RSDGT 016800 RSDGT 016900******************************************************************RSDGT 017000 GET-FAST-RSD. RSDGT 017100******************************************************************RSDGT 017200 RSDGT 017300 CALL "SPDEDBSCAN" USING TRACE-BASE, DB-STATUS, RSDGT 017400 RSD-RECORD, DB-PARM. RSDGT 017500 RSDGT 017600 IF NOT (DB-CALL-OK OR DB-END-OF-FILE) RSDGT 017700 MOVE SPACES TO PUNT-MESSAGE RSDGT 017800 STRING "GET FAST FAILED FOR RSD " RSDGT 017900 " KEY=" DB-VALUE DELIMITED BY SIZE RSDGT 018000 INTO PUNT-MESSAGE RSDGT 018100 CALL "SPDEEXPLAIN" USING DB-STATUS RSDGT 018200 PERFORM PROG-PUNT RSDGT 018300 END-IF. RSDGT 018400 RSDGT 018500 IF DB-CALL-OK RSDGT 018600 MOVE "Y" TO RSD-GET-INDICATOR RSDGT 018700 ELSE RSDGT 018800 MOVE "N" TO RSD-GET-INDICATOR RSDGT 018900 END-IF. RSDGT 019000 RSDGT 000001 RSDUP 001000******************************************************************RSDUP 001100 PUT-TO-RSD. RSDUP 001200******************************************************************RSDUP 001300 RSDUP 001400 CALL "DBPUT" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDUP 001500 DB-STATUS, RSD-ITEM-LIST, RSD-RECORD. RSDUP 001600 RSDUP 001700 IF NOT DB-CALL-OK RSDUP 001800 MOVE SPACES TO PUNT-MESSAGE RSDUP 001900 STRING "PUT FAILED FOR RSD " RSDUP 002000 "OUTER-JOB = " RSD-OUTER-JOB RSDUP 002100 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP 002200 PERFORM DB-PUNT RSDUP 002300 END-IF. RSDUP 002400 RSDUP 002500******************************************************************RSDUP 002600 UPDATE-RSD. RSDUP 002700******************************************************************RSDUP 002800 RSDUP 002900 CALL "DBUPDATE" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDUP 003000 DB-STATUS, RSD-ITEM-LIST, RSD-RECORD. RSDUP 003100 RSDUP 003200 IF NOT DB-CALL-OK RSDUP 003300 MOVE SPACES TO PUNT-MESSAGE RSDUP 003400 STRING "UPDATE FAILED FOR RSD " RSDUP 003500 "OUTER-JOB = " RSD-OUTER-JOB RSDUP 003600 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP 003700 PERFORM DB-PUNT RSDUP 003800 END-IF. RSDUP 003900 RSDUP 004000******************************************************************RSDUP 004100 DELETE-RSD. RSDUP 004200******************************************************************RSDUP 004300 RSDUP 004400 CALL "DBDELETE" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDUP 004500 DB-STATUS. RSDUP 004600 RSDUP 004700 IF NOT DB-CALL-OK RSDUP 004800 MOVE SPACES TO PUNT-MESSAGE RSDUP 004900 STRING "DELETE FAILED FOR RSD " RSDUP 005000 "OUTER-JOB = " RSD-OUTER-JOB RSDUP 005100 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP 005200 PERFORM DB-PUNT RSDUP 005300 END-IF. RSDUP 005400 RSDUP 005500******************************************************************RSDUP 005600 LOCK-RSD. RSDUP 005700******************************************************************RSDUP 005800 RSDUP 005900 CALL "DBLOCK" USING TRACE-BASE, RSD-SET, DB-MODE-3, RSDUP 006000 DB-STATUS. RSDUP 006100 RSDUP 006200 IF NOT DB-CALL-OK RSDUP 006300 MOVE SPACES TO PUNT-MESSAGE RSDUP 006400 STRING "LOCK FAILED FOR RSD " RSDUP 006500 "OUTER-JOB = " RSD-OUTER-JOB RSDUP 006600 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP 006700 PERFORM DB-PUNT RSDUP 006800 END-IF. RSDUP 006900 RSDUP ----------------------------------------------------------------------------------- You can quickly review what variables you have set on a global basis with the SHOW command. CG>SHOW Settings: Infile = TRACE.PUB(@) Infileformat = IMAGE Outfile = TRLIB.SOURCE Outfileformat = CLIB Outputmode = NEW Data = ON Read = ON Write = ON Prefix = AD Key == prefix+gentype SList = OFF SpeedDemon = ON
You can check individual options by typing the command with no parameters. So typing INPUT would show you what input file was opened, but typing INPUT FILENAME would set the input to the FILENAME specified.
That’s pretty much it, ClibGen has a few other features, but this is the basics of what it does.
Usability (also installation)
Well ClibGen is pretty darn easy to use, and is quick. The installation is even easier than most, just restore the tape with a CREATE option and you are set. All and all a pretty simple process.
Reliability
ClibGen generates good code, doesn’t abort, and is pretty forgiving with your command syntax. It is a very reliable tool as far as I am concerned.
Performance
ClibGen is performing a few interesting tricks. It is reading your data base root file, generating COBOL record layouts, and generating code for various database I/O routines. This happens within about a second, so you would have to say that ClibGen performs quit nicely.
Supportability (including Doc)
The product is pretty darn straight forward to use, and the documentation is a good reference guide, but the tutorial is tucked away in Appendix A, which makes it a bit difficult to find. The support is good, although the lack of an 800 number is a bit of a nuisance, but the product doesn’t really require much in the way of support, there just aren’t that many options, and it’s pretty easy to use.
Summary
This is a cool little program, a nice enhancement would be to print nicely formatted output for the copylib’s, with page numbers and an index. When they add the support for the other file formats, it will greatly expand the available market place. I see this program being very useful for consultants where you are constantly seeing new data bases’, and not necessarily very good copy libraries. Shop’s that aren’t doing any new development, probably won’t get much use out of it, because it is geared as a starting up utility.
One other enhancement I would like to see, would be the ability to set up code templates for the PROCEDURE DIVISION code. This way you could make the output look like how you want to work, and not how someone else decided it should look. We all have our own personal preferences when it comes to coding.
I like ClibGen a lot, but I think it is over priced for what you are getting, but that’s me, some people might think it’s a bargain It’s a new product, so the company will probably start to adjust as they get more feedback from the user community. If you are coding, and building copylib’s, you should check out ClibGen.
At-a-Glance box
ClibGen version A.00.00
VVL Associates Inc.
One Lauren Ln.
New Egypt, NJ 08533
Phone (609) 758-8858
FAX (609) 758-7114
email vince@vvl.com
Call, write, fax, or email to get a copy. The demo requires an HPSUSAN number. Price ranges from $1200-$4000, with support being $300. Includes one 67 page manual.